﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SCP_UNA_MVC.Models;
using SCP_UNA_MVC.Libs;
using System.Net.Mail;

namespace SCP_UNA_MVC.Controllers
{
    [RequireHttps]
    public class ClienteController : DefaultController
    {
        //
        // GET: /Cliente/
        public ActionResult Index()
        {
            ViewData["Mensagem"] = TempData["Mensagem"];
            return View();
        }

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();
            
            string error = string.Empty;
            bool success = false;

            try
            {
                string slogin = (String.IsNullOrEmpty(collection["login_add"]) ? null : collection["login_add"]);
                string senhasegura = PasswordHasher.Hash(collection["senha_add"]);

                int? numero = null;
                int? estado = null;
                int? cidade = null;

                if (!String.IsNullOrEmpty(collection["numero_add"]))
                    numero = Int32.Parse(collection["numero_add"]);

                if ((!String.IsNullOrEmpty(collection["estado_add"])) && (collection["estado_add"] != "null"))
                    estado = Int32.Parse(collection["estado_add"]);

                if ((!String.IsNullOrEmpty(collection["cidade_add"])) && (collection["cidade_add"] != "null"))
                    cidade = Int32.Parse(collection["cidade_add"]);

                var query = new Cliente()
                {
                    nome = (String.IsNullOrEmpty(collection["nome_add"]) ? null : collection["nome_add"]),
                    email = (String.IsNullOrEmpty(collection["email_add"]) ? null : collection["email_add"]),
                    login = slogin,
                    senha = senhasegura,
                    endereco = (String.IsNullOrEmpty(collection["endereco_add"]) ? null : collection["endereco_add"]),
                    numero = numero,
                    bairro = (String.IsNullOrEmpty(collection["bairro_add"]) ? null : collection["bairro_add"]),
                    complemento = (String.IsNullOrEmpty(collection["comple_add"]) ? null : collection["comple_add"]),
                    estadoid = estado,
                    cidadeid = cidade,
                    cep = (String.IsNullOrEmpty(collection["cep_add"]) ? null : collection["cep_add"]).Replace("-", ""),
                    tel = (String.IsNullOrEmpty(collection["tel_add"]) ? null : collection["tel_add"]).Replace("-", "").Replace(" ","").Replace("(", "").Replace(")", "").Trim(),
                    cel = (String.IsNullOrEmpty(collection["cel_add"]) ? null : collection["cel_add"]).Replace("-", "").Replace(" ","").Replace("(", "").Replace(")", "").Trim(),
                    recebeemails = Boolean.Parse(collection["aceito_email_add"]),
                    ehconfirmado = false
                };
                dt.Clientes.InsertOnSubmit(query);
                dt.SubmitChanges();
                EnviaEmailConfirmacaoAutenticidade(slogin);

                success = true;
            }
            catch (Exception e)
            {
                error = e.Message;
            }
            return Json(new { sucesso = success, mensagem = error });
        }

        [HttpPost]
        public ActionResult ReCreate(FormCollection collection)
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();

            string error = string.Empty;
            bool success = false;

            try
            {
                string senhasegura = PasswordHasher.Hash(collection["senha_add"]);

                int? numero = null;
                int? estado = null;
                int? cidade = null;

                if (!String.IsNullOrEmpty(collection["numero_add"]))
                    numero = Int32.Parse(collection["numero_add"]);

                if ((!String.IsNullOrEmpty(collection["estado_add"])) && (collection["estado_add"] != "null"))
                    estado = Int32.Parse(collection["estado_add"]);

                if ((!String.IsNullOrEmpty(collection["cidade_add"])) && (collection["cidade_add"] != "null"))
                    cidade = Int32.Parse(collection["cidade_add"]);

                var cliente = dt.Clientes.Single(q => q.id == Convert.ToInt32(Session["id_usuario"]));
                
                cliente.bairro = (String.IsNullOrEmpty(collection["bairro_add"]) ? null : collection["bairro_add"]);
                cliente.cel = (String.IsNullOrEmpty(collection["cel_add"]) ? null : collection["cel_add"]).Replace("-", "").Replace("(", "").Replace(") ", "");
                cliente.cep = (String.IsNullOrEmpty(collection["cep_add"]) ? null : collection["cep_add"]).Replace("-","");
                cliente.cidadeid = cidade;
                cliente.complemento = (String.IsNullOrEmpty(collection["comple_add"]) ? null : collection["comple_add"]);
                cliente.email = (String.IsNullOrEmpty(collection["email_add"]) ? null : collection["email_add"]);
                cliente.endereco = (String.IsNullOrEmpty(collection["endereco_add"]) ? null : collection["endereco_add"]);
                cliente.estadoid = estado;
                cliente.login = (String.IsNullOrEmpty(collection["login_add"]) ? null : collection["login_add"]);
                cliente.nome = (String.IsNullOrEmpty(collection["nome_add"]) ? null : collection["nome_add"]);
                cliente.numero = numero;
                cliente.recebeemails = Boolean.Parse(collection["aceito_email_add"]);
                cliente.senha = senhasegura;
                cliente.tel = (String.IsNullOrEmpty(collection["tel_add"]) ? null : collection["tel_add"]).Replace("-", "").Replace("(", "").Replace(") ", "");

                dt.SubmitChanges();

                success = true;
            }
            catch (Exception e)
            {
                error = e.Message;
            }
            return Json(new { successo = success, mensagem = error });
        }

        public ActionResult AlterarCliente()
        {
            Session["alterar_cliente"] = "true";

            return View();
        }

        public ActionResult IndexAtualizaCadastro()
        {
            return View();
        }

        public ActionResult Edit(int id)
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();

            var cliente = dt.Clientes.SingleOrDefault(q => q.id == id);

            return Json(cliente);
        }

        public ActionResult VerificaCadastro()
        {
            using(SCP_DataDataContext dt = new SCP_DataDataContext())
            {
                bool success = false;
                string msg = string.Empty;

                if (Session["PassPort"] != null)
                {
                    Cliente cli = dt.Clientes.SingleOrDefault(p => p.id == passportAtual.Id);

                    if (!String.IsNullOrEmpty(cli.endereco))
                    {
                        success = true;
                    }
                }
                else
                {
                    msg = "É preciso logar no sistema para efetuar uma compra.";
                }
                return Json(new { success, mensagem = msg }, JsonRequestBehavior.AllowGet);
            }
        }

        [CaptchaValidator]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VerificaAutenticidade(bool captchaValid)
        {
            //if (captchaValid)
            //{
            //    TempData["Mensagem"] = "Que bom, você não é um programa!";
            //}
            //else
            //{
            //    TempData["Mensagem"] = "As palavras são diferentes, é chato eu sei, mas é seguro. Por favo, tente novamente...";
            //}
            //return RedirectToAction("Index");
            
            string msg = string.Empty;
            if (!captchaValid)
                msg = "A palavra está diferente da imagem. É chato eu sei, mas é seguro. Por favor, tente novamente.";

            return Json(new { sucesso = captchaValid, mensagem = msg, opcao = "Add" });
        }

        [CaptchaValidator]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VerificaAutenticidadeAlteracao(bool captchaValid)
        {
            string msg = string.Empty;
            if (!captchaValid)
                msg = "A palavra está diferente da imagem. É chato eu sei, mas é seguro. Por favor, tente novamente.";

            return Json(new { sucesso = captchaValid, mensagem = msg, opcao = "Alterar" });
        }

        public ActionResult ExcluiMailing()
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();
            //using (SCP_DataDataContext dt = new SCP_DataDataContext())
            //{
                ViewData["ClienteID"] = new SelectList(dt.Clientes, "id", "nome");
                Cliente cliente = dt.Clientes.SingleOrDefault(c => c.id.Equals(this.HttpContext.Request.QueryString["id"]));
                if (cliente != null && cliente.email.Equals(this.HttpContext.Request.QueryString["email"]))
                {
                    cliente.recebeemails = false;
                    dt.SubmitChanges();
                    ViewData["Mensagem"] = "Tudo bem, você não receberá mais nossos e-mail's.<br />Se mudar de idéia é só atualizar o seu cadastro com a opção desejada.";
                }
            //}
            return View();
        }

        private void EnviaEmailConfirmacaoAutenticidade(string login)
        {
            if (!string.IsNullOrEmpty(login))
            {
                using (SCP_DataDataContext dt = new SCP_DataDataContext())
                {
                    Cliente cliente = dt.Clientes.SingleOrDefault(c => c.login.Equals(login));
                    if (cliente!=null)
                    {
                        if (!string.IsNullOrEmpty(cliente.email))
                        {
                            try
                            {
                                SmtpClient smtp = new SmtpClient();
                                MailMessage mail = new MailMessage("mailing@compreconstrua.com.br", cliente.email);
                                mail.Subject = "Compre & Construa - Confirmação de Cadastro";
                                mail.IsBodyHtml = true;
                                mail.Body = string.Format(
        @"<pre>Olá {0},

Agradeçemos pelo seu interesse em ser cliente do site Compre & Construa.
Esperamos que aproveite todos os produtos oferecidos em nosso site.

Para confirmar o seu cadastro no Compre & Construa, clique no link abaixo.

</pre>
<a href='http://www.compreconstrua.com.br/{1}?id={2}&email={3}' target='_blank'>Confirmar cadastro no Compre &amp; Construa.</a>
<br />
<br />
Atenciosamente,
Equipe Compre &amp; Construa.
<br />
<br />
Compre &amp; Construa. Sua compra protegida.
D&Uacute;VIDAS? Acesse <a href='http://www.compreconstrua.com.br/{4}' target='_blank'>Pol&iacute;tica de Privacidade.</a>
Este &eacute; um e-mail autom&aacute;tico disparado pelo sistema. Favor n&atilde;o respond&ecirc;-lo, pois esta conta não &eacute; monitorada.",
                                                          cliente.nome, Url.Action("ConfirmaAutenticidade", "Cliente"), cliente.id, cliente.email,
                                                          Url.Action("Seguranca", "Cliente"));
                                //smtp.SendAsync(mail, null);
                                smtp.Send(mail);
                            }
                            catch (Exception ex)
                            {
                                throw new ApplicationException(string.Format("Falha no envio de e-mail de confirmação de autenticidade.\n\rLogin \"{0}\".", login), ex);
                            }
                        }
                        else
                        {
                            throw new ApplicationException(string.Format("Falha no envio de e-mail de confirmação de autenticidade.\n\rLogin \"{0}\" não possui e-mail cadastrado.", login));
                        }
                    }
                    else
                    {
                        throw new ApplicationException(string.Format("Falha no envio de e-mail de confirmação de autenticidade.\n\rLogin \"{0}\" não encontrado no cadastro de clientes.", login));
                    }
                }
            }
            else
            {
                throw new ApplicationException(string.Format("Falha no envio de e-mail de confirmação de autenticidade.\n\rLogin \"{0}\" inválido.", login));
            }
        }

        public ActionResult ConfirmaAutenticidade()
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();
            ViewData["ClienteID"] = new SelectList(dt.Clientes, "id", "nome");
            Cliente cliente = dt.Clientes.SingleOrDefault(c => c.id.Equals(this.HttpContext.Request.QueryString["id"]));
            if (cliente != null && cliente.email.Equals(this.HttpContext.Request.QueryString["email"]) && !cliente.ehconfirmado)
            {
                cliente.ehconfirmado = true;
                dt.SubmitChanges();
                ViewData["Mensagem"] = string.Format("Olá {0}, seu cadastro está confirmado!\n\rAgora você pode finalizar a sua compra em nosso site.", cliente.nome);
            }
            return View();
        }

        public ActionResult Seguranca()
        {
            return View();
        }

        public ActionResult TermoUso()
        {
            return View();
        }

        public ActionResult EnviaEmailTeste(FormCollection collection)
        {
            string msg = string.Empty;
            using (SCP_DataDataContext dt = new SCP_DataDataContext())
            {
                Cliente cliente = dt.Clientes.SingleOrDefault(c => c.id.Equals(collection["ClienteID"]));
                if (cliente.recebeemails)
                {
                    SmtpClient smtp = new SmtpClient();
                    MailMessage mail = new MailMessage("mailing@compreconstrua.com.br", cliente.email);
                    mail.Subject = "Preços imbatíveis para você construir ou reformar a sua casa!";
                    mail.IsBodyHtml = true;
                    mail.Body = string.Format(
@"Para garantir que nossos comunicados cheguem em sua caixa de entrada,
adicione o e-mail {0} ao seu catálogo de endereços.

Este é um conteúdo confiável do Depósito Taquaril Ltda. para o qual você está atualmente cadastrado.
Se deseja não receber mais nossos e-mails <a href='http://localhost/{1}?id={2}&email={3}' target='_blank'>cancele sua inscrição aqui.</a>
Para mais informações por favor veja nossa <a href='http://localhost/{4}' target='_blank'>Política de Privacidade.</a>",
                                              mail.From, Url.Action("ExcluiMailing", "Cliente"), cliente.id, cliente.email,
                                              Url.Action("ExcluiMailing", "Cliente"));
                    //smtp.SendAsync(mail, null);
                    smtp.Send(mail);
                    msg = string.Format("Oba, e-mail promocional aceito pelo cliente {0} e enviado ao e-mail {1}!", cliente.nome, cliente.email);
                }
                else
                {
                    msg = string.Format("{0} não deseja ser incomodado.", cliente.nome);
                }
            }
            return Json(new { mensagem = msg }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult ClienteLocalizacao()
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();

            var local = dt.Clientes.SingleOrDefault(c => c.id == passportAtual.Id);

            return Json(new
            {
                endereco = local.endereco,
                numero = local.numero,
                bairro = local.bairro,
                complemento = local.complemento,
                estado = local.estadoid,
                cidade = local.cidadeid,
                cep = local.cep,
                tel = local.tel,
                cel = local.cel 
            }, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public ActionResult AtualizaEndereco(FormCollection collection)
        {
            SCP_DataDataContext dt = new SCP_DataDataContext();

            string error = string.Empty;
            bool success = false;

            try
            {
                var query = dt.Clientes.Single(q => q.id == passportAtual.Id);

                if (query != null)
                {
                    int? numero = null;
                    int? estado = null;
                    int? cidade = null;

                    if (!String.IsNullOrEmpty(collection["numero_edit"]))
                        numero = Int32.Parse(collection["numero_edit"]);

                    if ((!String.IsNullOrEmpty(collection["estado_edit"])) && (collection["estado_edit"] != "null"))
                        estado = Int32.Parse(collection["estado_edit"]);

                    if ((!String.IsNullOrEmpty(collection["cidade_edit"])) && (collection["cidade_edit"] != "null"))
                        cidade = Int32.Parse(collection["cidade_edit"]);

                    query.endereco = (String.IsNullOrEmpty(collection["endereco_edit"]) ? null : collection["endereco_edit"].ToString());
                    query.numero = numero;
                    query.bairro = (String.IsNullOrEmpty(collection["bairro_edit"]) ? null : collection["bairro_edit"].ToString());
                    query.complemento = (String.IsNullOrEmpty(collection["comple_edit"]) ? null : collection["comple_edit"].ToString());
                    query.estadoid = estado;
                    query.cidadeid = cidade;
                    query.cep = (String.IsNullOrEmpty(collection["cep_edit"]) ? null : collection["cep_edit"].ToString().Replace("-",String.Empty));
                    query.tel = (String.IsNullOrEmpty(collection["tel_edit"]) ? null : collection["tel_edit"].ToString().Replace("(", String.Empty).Replace(")", String.Empty).Replace("-", String.Empty).Replace(" ", String.Empty));
                    query.cel = (String.IsNullOrEmpty(collection["cel_edit"]) ? null : collection["cel_edit"].ToString().Replace("(", String.Empty).Replace(")", String.Empty).Replace("-", String.Empty).Replace(" ", String.Empty));

                    dt.SubmitChanges();

                    success = true;
                }
                else
                {
                    error = "Usuário não identificado.";
                }
            }
            catch (Exception e)
            {
                error = e.Message;
            }
            return Json(new { successo = success, mensagem = error });
        }

    }
}
